import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.NumberFormat;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;


public class Grafica extends JFrame implements ActionListener{

	private JTextField valorEmprestimo, taxaJuros, numeroPrestacoes;
	private JTextArea areaDeResultado;
	private JPanel contentPane;
	
	private double saldoDevedor, valor, juros, parcela;
	private int n;
	
	private Grafica(){
		
		//No BorderLayout, o painel fica dividido em cinco espaços (NORTE,
		//SUL, LESTE, OESTE E CENTRO), logo, para aproveitarmos melhor o 
		//design do layout, adicionamos um novo painel no NORTE, aonde 
		//poderemos usar um outro layout mais adequado para as informações
		//entradas pelo usuário
		JPanel panel = new JPanel();
		getContentPane().add(panel, BorderLayout.NORTH);
		
		//Aqui adicionamos um GridLayout, que separa o conteúdo em forma de 
		//tabela, ao painel do NORTE. no método construtor, definimos o número
		//de linhas, o número de colunas, o espaço entre linhas e o espaço 
		//entre colunas (nessa ordem)
		panel.setLayout(new GridLayout(3, 2, 0, 0));
		
		//Aqui criamos uma label (texto apenas explicativo na janela) para 
		//informar ao usuário que ele deve digitar o valor do empréstimo
		//a seguir, aonde é criado um textfield com tamanho de 10 colunas.
		//Esses dois são adicionados ao painel do NORTE. E processo se repete
		//nos outros três blocos de código
		JLabel valorLabel = new JLabel("Valor do Emprestimo");
		panel.add(valorLabel);
		valorEmprestimo = new JTextField();
		panel.add(valorEmprestimo);
		valorEmprestimo.setColumns(10);
		
		JLabel taxaLabel = new JLabel("Taxa de Juros");
		panel.add(taxaLabel);
		taxaJuros = new JTextField();
		panel.add(taxaJuros);
		taxaJuros.setColumns(10);
		
		JLabel prestacoesLabel = new JLabel("N\u00FAmero de Presta\u00E7\u00F5es");
		panel.add(prestacoesLabel);
		numeroPrestacoes = new JTextField();
		panel.add(numeroPrestacoes);
		numeroPrestacoes.setColumns(10);
		
		//Aqui criamos um botão para quando o usuário tiver passado todos os
		//parametros necessários para o programa, o mesmo possa calcular a 
		//tabela PRICE. Ao ser clicado, o botão gera um evento que será tratado
		//pela própria classe. Ao final, adicionamos o botão no SUL da janela.
		//(note que não é preciso adicionar um painel aqui, pois o botão é o
		//único elemento necessário no SUL da janela)
		JButton OK = new JButton("Calcular os Juros");
		OK.addActionListener(this);
		getContentPane().add(OK, BorderLayout.SOUTH);
		
		//Uma JScrollPane serve como um painel, entretanto, ela pode abrigar uma
		//área de texto grande que, caso necessário, possa ser navegável para
		//quaisquer direção, caso o contrário, se o texto passasse dos limites,
		//tanto horizontais quanto verticais, ele não seria visualmente acessível.
		//Esse JScrollPane foi adicionado no CENTRO da nossa janela
		JScrollPane scrollPane = new JScrollPane();
		getContentPane().add(scrollPane, BorderLayout.CENTER);
		
		//Aqui criamos uma área de texto que não pode ser editada pelo usuário 
		//(ela serve apenas para fins de visualização da informação) e a adicionamos
		//ao nosso JScrollPane criado anteriormente
		areaDeResultado = new JTextArea();
		areaDeResultado.setEditable(false);
		scrollPane.setViewportView(areaDeResultado);
		
		//Por fim, damos um título a nossa janela, definimos que ela estará visivel, 
		//que ela encerrará seu processo no fechamento padrão (no "X" vermelho) e
		//definimos seu tamanho
		setTitle("Calculo dos Juros");
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 473);
	}
	
	public static void main(String[] args) {
		//Aqui apenas instanciamos a janela, como todo o programa está no actionPerfomed
		//não é necessário fazer mais nada.
		new Grafica();
	}

	public void actionPerformed(ActionEvent arg0) {
		
		//Aqui criamos um NumberFormat para que seja usado na hora em que a informação
		//apareça, de forma mais agradável (na representação da moeda padrão do SO).
		//Também deletamos qualquer conteúdo antigo na área de texto.
		NumberFormat f = NumberFormat.getCurrencyInstance();
		areaDeResultado.setText(null);
		
		try{
			valor = Double.parseDouble(valorEmprestimo.getText());
			juros = Double.parseDouble(taxaJuros.getText());
			n = Integer.parseInt(numeroPrestacoes.getText());
			
			parcela = (valor * juros)/(1 - 1/Math.pow(1+juros, n));

			for (int i = 0; i < n; ++i){
				
				saldoDevedor = valor + (valor * juros) - parcela;
				areaDeResultado.append("Valor da " + (i + 1) + "a prestacao = " + f.format(valor - saldoDevedor) + '\n');
				valor = saldoDevedor;
			}
			
			areaDeResultado.append("\nValor final a ser pago = " + f.format(parcela * n));
			
		} catch (NumberFormatException e){
			areaDeResultado.setText("Foi passado um argumento invalido para o programa.\n"
					+ "Lembre-se de apenas usar números decimais para o Valor do \nEmpréstimo"
					+ "e para a Taxa de Juros, e números inteiros para o \nNúmero de Prestações"
					+ "Também lembre-se de que os números decimais \ndevem ser escritos com pontos"
					+ "e não virgulas");
		}
		
	}

}